using dotnet_ef_admin.Src.Services;
using Microsoft.AspNetCore.Mvc;

namespace dotnet_ef_admin.Src.Controllers;

[ApiController]
[Route("/api/v1/[controller]")]
public class AuthController(IAuthService _authService) : ControllerBase {
    /// <summary>
    ///     处理登录请求。
    /// </summary>
    /// <param name="request">包含登录信息的请求对象。</param>
    /// <returns>如果登录成功，返回包含令牌的信息；否则返回错误信息。</returns>
    [HttpPost("login")]
    public async Task<ActionResult<LoginResult>> Login(LoginRequest request) {
        // 尝试执行登录操作
        var result = await _authService.LoginAsync(request);

        // 如果登录失败（结果为null），返回错误信息
        if (result == null) return BadRequest("用户名或密码不正确");

        // 如果登录成功，返回包含登录成功消息和令牌的信息
        return Ok(
            new LoginResult {
                AccessToken = result.AccessToken,
            }
        );
    }

    // 可以添加注销的方法，如果需要的话
    /// <summary>
    ///     处理用户登出操作的 API 控制器方法。
    /// </summary>
    /// <remarks>
    ///     该方法从 HTTP 请求头中提取 JWT 令牌并将其传递给 <see cref="IAuthService.LogoutAsync" /> 方法。
    ///     然后，返回一个 HTTP 响应，其中包含操作结果的消息。
    /// </remarks>
    /// <returns>
    ///     一个 HTTP 响应，包含操作结果的消息。
    ///     成功时返回 HTTP 200 OK，并在响应正文中包含成功消息。
    ///     失败时返回 HTTP 400 Bad Request，并在响应正文中包含失败消息。
    /// </returns>
    [HttpPost("logout")]
    public async Task<IActionResult> Logout() {
        // 从 HTTP 请求头中提取 JWT 令牌
        if (!Request.Headers.TryGetValue("Authorization", out var authorizationHeader))
            // 如果未找到 Authorization 头，返回 HTTP 401 Unauthorized
            return Unauthorized("Authorization header is missing.");

        // 从 Authorization 头中提取 JWT 令牌并去掉 "Bearer " 前缀
        var token = authorizationHeader.ToString().Replace("Bearer ", "");

        // 调用 IAuthService.LogoutAsync 方法来执行登出操作
        var result = await _authService.LogoutAsync(token);

        // 根据操作结果返回 HTTP 响应
        if (result.IsSuccess)
            // 成功时返回 HTTP 200 OK
            return Ok(result.Message);
        // 失败时返回 HTTP 400 Bad Request   
        return BadRequest(result.Message);
    }

    /// <summary>
    ///     检查请求中是否包含有效的令牌。
    /// </summary>
    /// <returns>如果找到令牌，则返回令牌值；如果没有找到令牌，则返回错误信息。</returns>
    [HttpGet("check-token")]
    public IActionResult CheckToken() {
        // 尝试从请求头中获取Authorization信息
        if (Request.Headers.TryGetValue("Authorization", out var authHeader)) {
            // 从Authorization头部中移除"Bearer "前缀以提取令牌
            var token = authHeader.ToString().Replace("Bearer ", "");
            // 返回找到的令牌信息
            return Ok($"找到的令牌: {token}");
        }

        // 如果未找到Authorization头部，返回错误信息
        return BadRequest("缺少Authorization头部。");
    }
}